//
//  CJBaseTableViewController.h
//  DatangLife
//
//  Created by 娜 on 2018/4/19.
//  Copyright © 2018年 DatangLife. All rights reserved.
//

#import "CJBaseViewController.h"
#import "CJBaseTableView.h"
#import "CJBaseTableViewCell.h"

typedef void(^CJTableVcCellSelectedHandle)(CJBaseTableViewCell *cell, NSIndexPath *indexPath);

typedef NS_ENUM(NSUInteger, CJBaseTableVcRefreshType){
    /** 无法刷新*/
    CJBaseTableVcRefreshTypeNone = 0,
    /** 只能下拉刷新*/
    CJBaseTableVcRefreshTypeOnlyCanRefresh,
    /** 只能上拉加载*/
    CJBaseTableVcRefreshTypeOnlyCanLoadMore,
    /** 能刷新*/
    CJBaseTableVcRefreshTypeRefreshAndLoadMore
};

@interface CJBaseTableViewController : CJBaseViewController <UITableViewDelegate, UITableViewDataSource>


/**
 执行刷新
 */
@property (nonatomic, assign) NSInteger isRefresh;

/**
 执行上拉加载
 */
@property (nonatomic, assign) NSInteger isLoadMore;

/**
 添加空界面文字
 */
- (void)cj_addEmptyPageWithText:(NSString *)text;

/**
 设置导航栏右边item

 @param itemTitle itemTitle
 @param handle 点击执行方法
 */
- (void)cj_setUpNavRightItemTitle:(NSString *)itemTitle handle:(void(^)(NSString *rightItemTitle))handle;

/**
 设置导航栏左边item

 @param itemTitle itemTitle
 @param handle 点击执行方法
 */
- (void)cj_setUpNavLeftItemTitle:(NSString *)itemTitle handle:(void (^)(NSString *))handle;

/**
 监听通知

 @param notiName 通知名
 @param action 通知回调方法
 */
- (void)cj_observeNotiWithNotiName:(NSString *)notiName action:(SEL)action;

/**
 隐藏statusBar
 */
@property (nonatomic, assign) BOOL hiddenStatusBar;

/**
 statusBar风格
 */
@property (nonatomic, assign) UIStatusBarStyle barStrle;

/**
 导航右边Item
 */
@property (nonatomic, strong) UIBarButtonItem *navRightItem;

/**
 导航左边Item
 */
@property (nonatomic, strong) UIBarButtonItem *navLeftItem;

/**
 标题
 */
@property (nonatomic, copy) NSString *navItemTitle;

/**
 表视图
 */
@property (nonatomic, weak) CJBaseTableView *tableView;

/**
 表视图偏移
 */
@property (nonatomic, assign) UIEdgeInsets tableEdgeInset;

/**
 分割线颜色
 */
@property (nonatomic, assign) UIColor *sepLineColor;



/**
 加载刷新类型
 */
@property (nonatomic, assign) CJBaseTableVcRefreshType refreshType;

/**
 是否需要系统cell分割线
 */
@property (nonatomic, assign) BOOL needCellSepLine;

/**
 刷新数据
 */
- (void)cj_reloadData;

/**
 开始下拉
 */
- (void)cj_beginRefresh;

/**
 停止刷新
 */
- (void)cj_endRefresh;

/**
 停止上拉加载
 */
- (void)cj_endLoadMore;

/**
 隐藏刷新
 */
- (void)cj_hiddenRefresh;

/**
 隐藏上拉加载
 */
- (void)cj_hiddenLoadMore;

/**
 提示没有更多信息
 */
- (void)cj_noticeNoMoreData;

///**
// 配置数据
// */
//- (void)cj_commonConfigResponseWithPesponse:(id)response isRefresh:(BOOL)isRefresh modelClass:(__unsafe_unretained Class)modelClass;
//
///**
// 配置数据
//*/
//- (void)cj_commonConfigResponseWithResponse:(id)response isRefresh:(BOOL)isRefresh modelClass:(__unsafe_unretained Class)modelClass emptyText:(NSString *)emptyText;

/**
 是否在下拉刷新
 */
@property (nonatomic, assign, readonly) BOOL isHeaderRefreshing;

/**
 是否在上拉刷新
 */
@property (nonatomic, assign, readonly) BOOL isFooterRefreshing;

#pragma mark ============== 子类重写 ==============

/**
 分组数量
 */
- (NSInteger)cj_numberOfSections;

/**
 某个cell的数量
 */
- (NSInteger)cj_numberOfRowsInsection:(NSInteger)section;

/**
 某行的cell
 */
- (CJBaseTableViewCell *)cj_cellAtIndexPath:(NSIndexPath *)indexPath;

/**
 点击某行
 */
- (void)cj_didSelectCellAtIndexPath:(NSIndexPath *)indexPath cell:(CJBaseTableViewCell *)cell;

/**
 某行行高
 */
- (CGFloat)cj_cellHeightAtIndexPath:(NSIndexPath *)indexPath;

/**
 某个组头
 */
- (UIView *)cj_headerAtSection:(NSInteger)section;

/**
 某个组尾
 */
- (UIView *)cj_footerAtSection:(NSInteger)section;

/**
 某个组头高度
 */
- (CGFloat)cj_sectionHeaderHeightAtSection:(NSInteger)section;

/**
 某个组尾高度
 */
- (CGFloat)cj_sectionFooterHeightAtSection:(NSInteger)section;

/**
 分割线偏移量
 */
- (UIEdgeInsets)cj_sepEdgeInsetsAtIndexPath:(NSIndexPath *)indexPath;

#pragma mark ============== 子类去继承 ==============
/**
 刷新方法
 */
- (void)cj_refresh;

/**
 上拉加载方法
 */
- (void)cj_loadMore;

/**
 显示刷新图片
 */
@property (nonatomic, assign) BOOL showRefreshIcon;

- (void)endRefreshIconAnimation;



#pragma mark ============== loading & alert ==============

- (void)cj_showLoading;

- (void)cj_hiddenLoading;

- (void)cj_showTitle:(NSString *)title after:(NSTimeInterval)after;


@end
